iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

用python學習資料結構與演算法 學習筆記系列 第 10

Tree (樹) 與 Binary Tree-1 (二元樹-1)

  • 分享至 

  • xImage
  •  

Tree (樹)

樹狀結構(tree)是一個非線性、有階層關係(hierarchical relationship)、非循環的資料結構。每個節點有的參數為其本身的資料和他連接的子類別。在某些裝況下,使用樹的效率會較其他資料結構的效率高,其包含Binary Search Tree, AVL, Red Black Tree, Trie......等等。我們的檔案系統或者是DOM也都使用tree。我們先介紹一下關於樹的專有名詞。因為中文翻譯有點奇怪,專有名詞的部分就直接用英文表示。
Root: tree最上面的節點,其無parent。
Edge: parent node and child node間的連結
Leaf: 沒有child node的節點
Sibling: 有共同parent的children節點
Ancestor: 一個節點的祖先(parent node, grandparent node, great grandparent nodes 都算)
Depth of node: 從root 到某個節點的距離(節點深度)
Height of node: 從某個節點到其最深(最底)節點的距離(節點的高) (等等介紹AVL時會用到)
Depth of tree: root node 的深度
Height of tree: root node 的高
https://ithelp.ithome.com.tw/upload/images/20230919/20162172aQSnYjpscy.png
圖1. 在這個例子裡,N1為root,因此depth of tree=0, Height of tree=3。而其餘節點,像是N2,其depth=1, height=2。

Binary Tree (二元樹)

二元樹為一種樹狀資料結構,每個節點最多只有兩個子節點,通常簡稱為left child和right child。之後會要討論的Binary Search Tree, Heap Tree, AVL, red black trees, 和Syntax tree都屬於二元樹。二元樹有幾個專有名次分別為:
Full Binary Tree: 每個節點的子節點數不是0就是2。。
Perfect Binary Tree:除了葉子(leaf node) 外的所有節點都有兩個子節點。
Complete Binary Tree:樹裡每個節點的值由上到下,由左到右照順序排列。
Balanced Binary Tree: 每個節點,左右子樹的高不超過1。

這裡我先做幾個tree traversal(有系統的拜訪樹的每個節點一次)的介紹:
Traversal 可以分為Depth first search (深度優先)和breadth first search (寬度優先),Depth first search 的例子又有preorder traversal, inorder traversal, and postorder traversal,下面我們分別介紹。

Depth first search (深度優先):
1. Preorder traversal: 拜訪節點的順序為root -> left subtree ->right subtree 。在圖2的例子中,拜訪節點的順序為N1-> N2 -> N4 -> N9 -> N10 -> N5 -> N3 -> N6 -> N7。
2. Inorder traversal: 拜訪節點的順序為left subtree -> root-> right subtree。在圖2的例子中,拜訪節點的順序為N9 -> N4 -> N10 -> N2 -> N5 -> N1 -> N6 -> N3 -> N7。
3. Postorder traversal: 拜訪節點的順序為left subtree -> right subtree -> root。在圖2的例子中,拜訪節點的順序為N9 -> N10 -> N4 -> N5 -> N2 -> N6 -> N7 -> N3 -> N1。
https://ithelp.ithome.com.tw/upload/images/20230919/201621725dNdJtZ9Qk.png
圖2. 在看tree traversal的時候,將subtree圈起來會更容易理解。

Breadth first search(廣度優先):
1. Level order traversal: 拜訪節點的順序為level by level,在圖3的例子中,拜訪節點的順序為N1 -> N2 -> N3 -> N4 -> N5 -> N6 -> N7 -> N9 -> N10。(level1->level2->level3->level4)
https://ithelp.ithome.com.tw/upload/images/20230919/201621729rYEBp4bov.png
圖 3. Level order traversal 為廣度優先的traversal方法,每層由左到右拜訪每個節點。

https://ithelp.ithome.com.tw/upload/images/20230919/20162172fxthUXhF09.png
圖 4.用doubly linked list 二元樹。

到這裡先讓大家消化一下,明天再來帶大家分別用linked list和python list demo。

參考資料:
本文主要為udemy課程: The Complete Data Structures and Algorithms Course in Python的學習筆記,有興趣的人可以自己上去看看。


上一篇
Recursion (遞迴)
下一篇
Binary Tree -2 (二元樹-2)
系列文
用python學習資料結構與演算法 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言